﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIPDTO;

namespace SIPDAL
{
    public class mgUsuario
    {

        /// <summary>
        /// Declaracion de Variables
        /// </summary>
        SIPDataContext _dc = new SIPDataContext();
        dtoError _resp = new dtoError();
        tblUsuario _tblFunc = new tblUsuario();
        dtoUsuario _dtoFuncionario = new dtoUsuario();
        List< dtoUsuario> _dtFuncionario = new  List<dtoUsuario>();

        /// <summary>
        /// Constructor de la clase.
        /// </summary>
        public mgUsuario()
        {
            
        }


        /// <summary>
        /// Procedimiento para crear usuarios
        /// </summary>
        /// <param name="funcionario"></param>
        /// <returns></returns>
        public dtoError Crear_Usuario(dtoUsuario  funcionario, int evento)
        {
            _tblFunc.id_perfil = funcionario.Perfil;
            _tblFunc.id_parroquia  = funcionario.Parroquia;
            _tblFunc.nombre_usuario = funcionario.Usuario;
            _tblFunc.contrasena = funcionario.Password;
            _tblFunc.activo = funcionario.Estado;
            try
            {
                _resp = Existe_Usuario(funcionario);
                if ((_resp.IdError == -101) && (evento == 1))
                {
                    _dc.tblUsuarios.InsertOnSubmit(_tblFunc);
                    _dc.SubmitChanges();
                    _resp.Mensaje = "Informacion guardada correctamente.";
                    _resp.IdError = 100;
                }
                if ((_resp.IdError == 101) && (evento == 1))
                {
                    _resp.Mensaje = "La información del usuario ya se encuentra registrada.";
                    _resp.IdError = -100;
                }
                else if ((_resp.IdError == 101) && (evento == 2))// Se modifica los registros delusuario
                {
                    tblUsuario  param = _dc.tblUsuarios.Single(p => p.nombre_usuario == funcionario.Usuario);
                    param.id_perfil = funcionario.Perfil;
                    param.contrasena = funcionario.Password;
                    param.activo = funcionario.Estado;
                    _dc.SubmitChanges();
                    _resp.Mensaje = "Información modificada correctamente.";
                    _resp.IdError = 100;

                }

                return _resp;
            }
            catch (Exception ex)
            {

                _resp.Mensaje = ex.Message.ToString();
                _resp.IdError = -100;

                return _resp;
            }

        }

        /// <summary>
        /// Valida el ingreso del usuario a la aplicación
        /// </summary>
        /// <param name="funcionario"></param>
        /// <returns></returns>
        public dtoError  Validar_Usuario(dtoUsuario funcionario)
        {
          try
            {
               var funcionarios = (from p in _dc.tblUsuarios
                                    where p.nombre_usuario == funcionario.Usuario
                                    && p.contrasena == funcionario.Password 
                                    && p.activo == true 
                                    select p).Count();

                if (Convert.ToInt32(funcionarios.ToString()) > 0)
                {
                    _resp.IdError = 102;
                    _resp.Mensaje = "Usuario y Password correctos";
                }
                else
                {
                    _resp.IdError = -102;
                    _resp.Mensaje = "Usuario o Password incorrectos";
                }

               // return resp;
            }
            catch (Exception ex)
            {
                _resp.IdError = -100;
                _resp.Mensaje = ex.Message.ToString();
                return _resp;
                throw;
            }
          return _resp;
        }

        /// <summary>
        /// Verifica la existencia del usuario en la tabla Usuarios.
        /// </summary>
        /// <param name="funcionario"></param>
        /// <returns></returns>
        public dtoError Existe_Usuario(dtoUsuario  funcionario)
        {

        try
            {

                var condicion = (from p in _dc.tblUsuarios 
                             where p.nombre_usuario == funcionario.Usuario
                             select p).Count();
            if (Convert.ToInt32(condicion.ToString()) > 0)
            {
                _resp.Mensaje = "Registro ya existe en la tabla de Usuarios";
                _resp.IdError = 101;
            }
            else
            {
                _resp.IdError = -101;
                _resp.Mensaje = "Registro no existe en la tabla de Usuarios";
            }

            }
            catch (Exception ex)
            {
                _resp.IdError = -100;
                _resp.Mensaje = ex.Message.ToString();
                return _resp;
                throw;
            }
        return _resp;
        }


        /// <summary>
        /// Metodo para obtener los datos del usuario que se van a mostrar en la pantalla Usuarios,
        /// La búsqueda se efectua por identificacion y tipo
        /// </summary>
        /// <param name="pers"></param>
        /// <returns></returns>
        public List<dtoUsuario> ObtenerUsuario(dtoUsuario user)
        {
            int i = 0;
            try
            {
                var condicion = (from p in _dc.tblUsuarios
                                 where p.nombre_usuario == user.Usuario
                                 select p);

                foreach (tblUsuario  reg in condicion)
                {
                    _dtFuncionario.Add(new dtoUsuario ());
                    _dtFuncionario[i].Usuario = reg.nombre_usuario;
                    _dtFuncionario[i].Perfil = Convert.ToInt16(reg.id_perfil);
                     _dtFuncionario[i].Parroquia = Convert.ToInt16(reg.id_parroquia);
                    _dtFuncionario[i].Password = reg.contrasena;
                    _dtFuncionario[i].Estado = Convert.ToBoolean(reg.activo);
                    i++;
                }

            }
            catch (Exception ex)
            {
                throw new Exception("Ocurrió un error al obtener los datos " + ex.Message);
            }

            return _dtFuncionario;
        }


        /// <summary>
        /// Metodo para obtener la lista de todos los usuarios que se mostrarán para cargar el grid
        /// </summary>
        /// <param></param>
        /// <returns></returns>
        public List<dtoUsuario> ObtenerTodosUsuarios() 
        {
            int i = 0;
            try
            {
                var condicion = (from p in _dc.tblUsuarios 
                                 select p).ToList();

                foreach (tblUsuario reg in condicion)
                    {
                        _dtFuncionario.Add(new dtoUsuario());
                        _dtFuncionario[i].Usuario = reg.nombre_usuario;
                        _dtFuncionario[i].Perfil = Convert.ToInt16(reg.id_perfil);
                        _dtFuncionario[i].Parroquia = Convert.ToInt16(reg.id_parroquia);
                        _dtFuncionario[i].Estado = Convert.ToBoolean(reg.activo);
                        i++;
                    }
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudo recuperar la informacion. " + ex.Message);
            }

            return _dtFuncionario;

        }

        /// <summary>
        /// Metodo para inactivar usuarios
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>

        public dtoError InactivarUsuario(dtoUsuario user)
        {
            try
            {
                var condicion = (from p in _dc.tblUsuarios 
                                 where p.nombre_usuario == user.Usuario
                                 select p).ToList();
                foreach (tblUsuario _usuario in condicion)
                {
                    _usuario.activo = user.Estado;
                    _dc.SubmitChanges();
                    _resp.Mensaje = "Usuario inactivado correctamente.";
                    _resp.IdError = 100;
                }

            }
            catch (Exception ex)
            {
                _resp.IdError = -100;
                _resp.Mensaje = ex.Message.ToString();
                return _resp;
                throw;
            }

            return _resp;
        }
    }

}
